package com.media.system.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.media.system.domain.MediaFile;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 媒体文件数据层
 * 
 * @author Claude
 * @since 2024-01-20
 */
@Mapper
public interface MediaFileMapper extends BaseMapper<MediaFile> {

    /**
     * 根据用户ID查询媒体文件列表
     * 
     * @param userId 用户ID
     * @return 媒体文件列表
     */
    List<MediaFile> selectMediaFilesByUserId(@Param("userId") Long userId);

    /**
     * 根据家庭ID查询媒体文件列表
     * 
     * @param familyId 家庭ID
     * @return 媒体文件列表
     */
    List<MediaFile> selectMediaFilesByFamilyId(@Param("familyId") Long familyId);

    /**
     * 根据文件类型查询媒体文件
     * 
     * @param fileType 文件类型
     * @param userId 用户ID
     * @return 媒体文件列表
     */
    List<MediaFile> selectMediaFilesByType(@Param("fileType") String fileType, @Param("userId") Long userId);

    /**
     * 根据文件哈希值查询重复文件
     * 
     * @param fileHash 文件哈希值
     * @param userId 用户ID
     * @return 媒体文件
     */
    MediaFile selectMediaFileByHash(@Param("fileHash") String fileHash, @Param("userId") Long userId);

    /**
     * 根据标签搜索媒体文件
     * 
     * @param tags 标签关键字
     * @param userId 用户ID
     * @return 媒体文件列表
     */
    List<MediaFile> selectMediaFilesByTags(@Param("tags") String tags, @Param("userId") Long userId);

    /**
     * 获取用户存储统计
     * 
     * @param userId 用户ID
     * @return 统计信息
     */
    List<java.util.Map<String, Object>> selectStorageStatsByUserId(@Param("userId") Long userId);

    /**
     * 获取最近上传的文件
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 媒体文件列表
     */
    List<MediaFile> selectRecentMediaFiles(@Param("userId") Long userId, @Param("limit") Integer limit);

    /**
     * 获取收藏的文件
     * 
     * @param userId 用户ID
     * @return 媒体文件列表
     */
    List<MediaFile> selectFavoriteMediaFiles(@Param("userId") Long userId);

    /**
     * 更新文件查看次数
     * 
     * @param fileId 文件ID
     */
    void updateViewCount(@Param("fileId") Long fileId);

    /**
     * 更新文件下载次数
     * 
     * @param fileId 文件ID
     */
    void updateDownloadCount(@Param("fileId") Long fileId);

    /**
     * 批量删除文件
     * 
     * @param fileIds 文件ID列表
     * @param userId 用户ID
     * @return 影响行数
     */
    int batchDeleteFiles(@Param("fileIds") List<Long> fileIds, @Param("userId") Long userId);

    /**
     * 根据时间范围查询文件
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 媒体文件列表
     */
    List<MediaFile> selectMediaFilesByTimeRange(@Param("userId") Long userId, 
                                               @Param("startTime") String startTime, 
                                               @Param("endTime") String endTime);
}